package com.example.javamaday.leetcode;

import java.util.HashMap;

public class LeetCodeTest0383 {

    public static void main(String[] args) {
        new LeetCodeTest0383().canConstruct("aa", "ab");
    }

    /**
     * 给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串，判断第一个字符串 ransom
     * 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成，返回 true ；否则返回 false。
     * <p>
     * (题目说明：为了不暴露赎金信字迹，要从杂志上搜索各个需要的字母，组成单词来表达意思。
     * 杂志字符串中的每个字符只能在赎金信字符串中使用一次。)
     */
    public boolean canConstruct(String ransomNote, String magazine) {
        if (magazine.length() == 0) {
            return false;
        }
        boolean result = true;
        char[] rChars = ransomNote.toCharArray();
        char[] mChars = magazine.toCharArray();
        // 统计每个数字，出现的次数
        HashMap<Character, Integer> mMap = new HashMap<>();
        for (char mChar : mChars) {
            if (mMap.get(mChar) == null) {
                mMap.put(mChar, 1);
            } else {
                int num = mMap.get(mChar);
                mMap.put(mChar, num + 1);
            }
        }
        for (char rChar : rChars) {
            if (mMap.get(rChar) == null) {
                result = false;
                break;
            }
            int num = mMap.get(rChar);
            if (num > 1) {
                mMap.put(rChar, num - 1);
            } else {
                mMap.remove(rChar);
            }
        }
        return result;
    }
}
